#region Usings

using System;
using System.IO;
using NUnit.Framework;
using Karma.Framework.Core.Domain.Tools.Import.Layout;
using Karma.Framework.Core.Domain.Tools.Import.Validation;
using Karma.Framework.Core.Test.Domain.Tools.Importador.Entidades;

#endregion

namespace Karma.Framework.Core.Test.Domain.Tools.Importador
{
    [TestFixture]
    public class ValidadorDatosFixture
    {
        [Test]
        public void ValidaEntidadConAsciadoIdFormatoIncorrectoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "IdFormatoIncorrecto.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);

            Assert.IsNotNull(summary.ErrorSummary);
            Assert.IsTrue(summary.ErrorSummary.HasErrors);
            Assert.IsNotNull(summary.ErrorSummary.Errors);

            Assert.AreEqual(1, summary.ErrorSummary.Errors.Count);

            var error = summary.ErrorSummary.Errors[0];
            Assert.AreEqual(1, error.Line);
            Assert.AreEqual(4, error.Column);
            Assert.AreEqual(ErrorSeverity.Error, error.Severity);
            Assert.AreEqual(ErrorType.Data, error.Type);
            Assert.AreEqual("Formato invalido: [aaaa]", error.Description);
        }

        [Test]
        public void ValidaEntidadConAsciadoIdRefTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadConAsciadoIdRefVacioTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosConIdRef>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "Vacio.xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(2, summary.ErrorSummary.Errors.Count);
        }

        [Test]
        public void ValidaEntidadConAsciadoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadConAsociadosYAgregadosErrorReferenciaAgregadoTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout =
                factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig {GenerateAggregates = true},
                                                              new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "ErrorReferenciaAgregado.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);
            Assert.AreEqual(2, summary.ErrorSummary.Errors.Count);
        }

        [Test]
        public void ValidaEntidadConAsociadosYAgregadosTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadConAsociadosYAgregados>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }

        [Test]
        public void ValidaEntidadSimpleErrorDatosEnteroTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "ErrorDatosEntero.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);

            Assert.IsNotNull(summary.ErrorSummary);
            Assert.IsTrue(summary.ErrorSummary.HasErrors);
            Assert.IsNotNull(summary.ErrorSummary.Errors);

            Assert.AreEqual(1, summary.ErrorSummary.Errors.Count);

            var error = summary.ErrorSummary.Errors[0];
            Assert.AreEqual(1, error.Line);
            Assert.AreEqual(2, error.Column);
            Assert.AreEqual(ErrorSeverity.Error, error.Severity);
            Assert.AreEqual(ErrorType.Data, error.Type);
            Assert.AreEqual("Formato invalido: [1E+96]", error.Description);
        }

        [Test]
        public void ValidaEntidadSimpleErrorDatosFechaTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "ErrorDatosFecha.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);

            Assert.IsNotNull(summary.ErrorSummary);
            Assert.IsTrue(summary.ErrorSummary.HasErrors);
            Assert.IsNotNull(summary.ErrorSummary.Errors);

            Assert.AreEqual(1, summary.ErrorSummary.Errors.Count);

            var error = summary.ErrorSummary.Errors[0];
            Assert.AreEqual(1, error.Line);
            Assert.AreEqual(3, error.Column);
            Assert.AreEqual(ErrorSeverity.Error, error.Severity);
            Assert.AreEqual(ErrorType.Data, error.Type);
            Assert.AreEqual("Formato invalido: [40/05/2009]", error.Description);
        }

        [Test]
        public void ValidaEntidadSimpleErrorDatosTamanhoCadenaTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + "ErrorDatosTamanhoCadena.xlsx",
                                                               FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsTrue(summary.HasErrors);

            Assert.IsNotNull(summary.ErrorSummary);
            Assert.IsTrue(summary.ErrorSummary.HasErrors);
            Assert.IsNotNull(summary.ErrorSummary.Errors);

            Assert.AreEqual(1, summary.ErrorSummary.Errors.Count);

            var error = summary.ErrorSummary.Errors[0];
            Assert.AreEqual(5, error.Line);
            Assert.AreEqual(1, error.Column);
            Assert.AreEqual(ErrorSeverity.Error, error.Severity);
            Assert.AreEqual(ErrorType.Data, error.Type);
            Assert.AreEqual("Formato invalido: [eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee]", error.Description);
        }

        [Test]
        public void ValidaEntidadSimpleTest()
        {
            var factory = new DefaultLayoutFactory();
            var layout = factory.Create<EntidadSimple>(new LayoutFactoryConfig(), new Type[] {});

            var archivoBuilder = new ExcelLayoutFileReader();
            var data = archivoBuilder.ReadFileData(layout, new FileStream(
                                                               "..\\..\\Domain\\Tools\\Importador\\Archivos\\" +
                                                               layout.Entity.Name + ".xlsx", FileMode.Open,
                                                               FileAccess.ReadWrite, FileShare.Read));
            var validador = new DefaultDataValidator();
            var summary = validador.Validate(data);

            Assert.IsNotNull(summary);
            Assert.IsFalse(summary.HasErrors);
        }
    }
}